import os
import unittest
import ddt
from common.browser import open_browser
from page.page_index import Index
from page.page_login import Login
from common.data_operation import DataOperation

# 准备账号数据
# 获取当前工程绝对路径
report = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 存放账号数据的表格名称
file_name = 'data/user_login.xls'
# 路径拼接
file_path = os.path.join(report, file_name)
# 调用数据操作方法
user_account = DataOperation(path=file_path, sheet_name='success').get_data_todict()
user_fail_account = DataOperation(path=file_path, sheet_name='fail').get_data_todict()


@ddt.ddt
class TestUserLogin(unittest.TestCase):
    # 大夹具,在所有测试方法执行之前打开浏览器
    @classmethod
    def setUpClass(cls) -> None:
        # 打开浏览器
        driver = open_browser()
        # 创建首页page和登录page的实例对象
        cls.index = Index(driver)
        cls.login = Login(driver)

    def setUp(self) -> None:
        # 请求网址
        self.index.get(self.index.index_url)
        # 隐式等待
        self.login.implicitly_wait()
        # 点击请登录
        self.index.btn_index_login()

    @ddt.data(*user_account)
    def test_success(self, data):
        """
        # 请求网址
        self.index.get(self.index.index_url)
        # 隐式等待
        self.login.implicitly_wait()
        # 点击请登录
        self.index.btn_index_login()
        """
        # 登录操作
        # 输入用户名
        self.login.ipt_username(data['username'])
        # 输入密码
        self.login.ipt_password(data['password'])
        # 请保存我这次的登录信息
        self.login.remember()
        # 点击登录按钮
        self.login.btn_login()
        # 断言登录成功
        # 获取首页的用户名文本
        username = self.index.username_text()
        # 通过用户输入的用户名和获取到的用户名相等来断言登录成功
        self.assertEqual(data['username'], username)

    # 小夹具,每个账号登录后需要先退出登录
    def tearDown(self) -> None:
        self.index.btn_quit_login()

    @ddt.data(*user_fail_account)
    def test_fail(self, data):
        """
        # 请求网址
        self.index.get(self.index.index_url)
        # 隐式等待
        self.login.implicitly_wait()
        # 点击请登录
        self.index.btn_index_login()
        """
        # 登录操作
        # 输入用户名
        self.login.ipt_username(data['username'])
        # 输入密码
        self.login.ipt_password(data['password'])
        # 请保存我这次的登录信息
        self.login.remember()
        # 点击登录按钮
        self.login.btn_login()
        # 断言登录失败
        # 获取首页的用户名文本
        username = self.index.username_text()
        # 通过获取到的用户名为空来断言登录失败
        self.assertIsNone(username)

    # 大夹具,在所有测试方法执行后关闭浏览器
    @classmethod
    def tearDownClass(cls) -> None:
        cls.index.quit()


if __name__ == '__main__':
    unittest.main(verbosity=2)



